package com.qf.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

/**
 * 创建者: QF-SUN
 * 创建时间: 2023/4/19 11:10
 * 描述: 切面类
 * @Aspect: 标记该类为切面类
 *
 * 需求：获取 谁（当前用户，session）在什么时间调用了什么类，什么方法， 参数是什么，返回值是什么
 *
 *
 */
@Aspect
@Component
public class AspectTest {

    //定义切入点表达式, 方法没有特殊的要求，无返回值，无参， 方法名任意
    @Pointcut("execution(* com.qf.service..*.*(..))")
    public void pc(){}

    /**
     * 环绕增强 = 前置 + 后置 + 最终  + 异常
     * 只有在环绕增强中才可以获取原始方法的返回值
     * joinPoint: 连接点（方法）
     */
    @Around("pc()")
    public Object around(ProceedingJoinPoint joinPoint){
        //获取类
        String className = joinPoint.getTarget().getClass().getName();

        //获取方法
        String methodName = joinPoint.getSignature().getName();

        Object[] args = joinPoint.getArgs();

        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date()) +
                 "-----" + className + "." + methodName+"(" + Arrays.toString(args) +")");


        try {
            System.out.println("前置");
            //joinPoint.proceed(): 调用原始方法
            //result: 真实方法的返回值
            Object result = joinPoint.proceed();
            System.out.println(result);
            System.out.println("后置");
            return result;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("异常");
        } finally {
            System.out.println("最终");
        }
        return  null;
    }
    //JoinPoint 与ProceedingJoinPoint 区别
    //ProceedingJoinPoint 可以调用原始方法
    //JoinPoint 不可以调用原始方法
    @Before("pc()")
    public void before(JoinPoint joinPoint){
        System.out.println("前置增强");
    }

    @AfterReturning("pc()")
    public void afterReturning(){
        System.out.println("后置增强");
    }

    @After("pc()")
    public void after(){
        System.out.println("最终增强");
    }
//
//    @AfterThrowing("pc()")
//    public void afterThrowing(){
//        System.out.println("异常增强");
//    }






}
